/*
*
* This file is part of Luces de 1984 (L1).
* Copyright (C) <2017>  <alkeon> [alkeon@autistici.org]
   
* L1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* L1 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l1.  If not, see <http://www.gnu.org/licenses/>.
*
*/
#include <string>
#include <random>
#include <sstream>
#include "metodos.h"
#include <curses.h>
#include <ncurses.h>
#include "gp.h"
using namespace std;

// Métodos clase Game
// Constructor y destructor
juego::juego(){
	this->panel_resuelto=0;
}
juego::~juego(){}


void juego::preguntas_principales(Personaje& v,Personaje& h){
	char p[2]; 
	guardar("1", v);
	this->printa("Narrador:Oyes el sonido de gotas precipitándose hacia el suelo\n");
	this->printa("No puedes respirar bien por un objeto metálico colocado alrededor del cuello que te hace estar muy incómodo.\n");
	this->pausa();
	this->printa("Narrador:¿Qué decides hacer?\n");
	this->printa("1.- Levantarte e intentar escaparte.\n");
	this->printa("2.- Con la mano derecha tirar algo hacia el pasillo para que vayan tras él.\n");
	getstr(p);
	if(p[0] == '1'){
		this->peli(v,h);
	}else{
		this->falso(v,h);
	}
}

void juego::peli(Personaje& v, Personaje& h){

	this->printa("Narrador:Al levantarte además de romper varios cables sueltos, escuchas por otro lado un preso gritando que volverían las oscuras golondrinas, de tu balcón... Este antes de ser abatido a tiros dijo quinientos once.\n");
	this->printa(v.nombre+":¿Qué significa ese número?\n");
	this->pausa();
	this->reflexion(v,h);
	
}


void juego::reflexion(Personaje& v, Personaje& h){
	this->printa("Narrador:Notas un golpe fuerte en tu nuca por culpa del poema, te distrajo de lo que tenías en mente.\n");
	this->printa("Narrador:Te despiertas atado en una silla con cuatro cámaras alrededor.\n");
	this->printa("Narrador:Al verte en esta situación te olvidas de las demás ideas y te centras en una.\n");
	this->printa(v.nombre+":¿De verdad estas cámaras me controlan? Las cámaras nos controlan pero esa no creo que se la intención.\n");
	this->printa(v.nombre+":¡Espera! Si están desconectadas ahora que me doy cuenta, no están orientadas a la cara.\n");
	this->printa(v.nombre+":Aquí algo falla\n");
	this->printa(v.nombre+":¿Entonces todo esto es mentira?\n");
	this->pausa();
	this->interrogatorio(v,h);
}

void juego::interrogatorio(Personaje& v, Personaje& h){
	guardar("a2", v);
	this->printa("Narrador:Unos pasos desde lejos distraen tu pensamiento\n");
	this->printa("Narrador:Tu silla se mueve y te coloca frente una mesa\n");
	this->printa("Narrador:Prestas atención y notas como se acercan pisadas muy rápidas.\n");
	this->printa("Narrador:Puedes probar a huir.\n");
	char eleccion[2];
	this->printa("Narrador:¿Qué piensas hacer?\n");
	this->printa("1.- Te acercas para pegarle con la porra\n");
	this->printa("2.- Huyes para evitar más preguntas\n");
	getstr(eleccion);
	if (eleccion[0]=='1'){
		this->continuacion_interroga(v,h);

	} else {
		this->asesinato(v,h);
	}
}
//5
void juego::continuacion_interroga(Personaje& v,Personaje& h){
	string p;
	while(v.vida>=0 && h.vida>=0){
		v.pegar(h);
		stringstream strings;
		random_device rd;
		strings << rd();
		string random_str=strings.str();
		if(random_str[0]=='1'){
			h.pegar(v);
			this->printa("Narrador:Te golpeó\n");
		}else{
			this->printa("Narrador:Lo esquivaste\n");
		}
	}
	this->pausa();
	this->pelea_stats(v,h);
	this->huida(v,h);
}
//6
void juego::huida(Personaje& v,Personaje& h){
	guardar("a3", v);
	this->printa(v.nombre+":Vaya, lo he matado, aunque me he podido defender con la porra, ha conseguido clavarme una navaja.\n");
	this->printa("Narrador:Para sacarte la navaja, pierdes un poco de sangre, ya que por suerte no ha sido mucho porque le agarraste la mano\n");
	this->printa(v.nombre+":Como está muerto por lo menos me quedo con su navaja y con tu camiseta te haces taponas la herida para que no te desangres.\n");
	this->printa("Narrador:Obtienes 7 de daño.\n");
	this->pausa();
	v.ataque+=7;
	this->printa(v.nombre+":Aunque sea un poco asqueroso creo que le voy a quitar la ropa.\n");
	
	this->printa(v.nombre+":Así es más fácil entablar conversación con ellos.\n");
	this->printa("Narrador:Ahora no puedes ser descubierto pero ante todo evita cualquier pregunta o conversación con ellos.\n");
	this->printa("Narrador:Mientras andas por un pasillo un tanto largo, decides pensar en qué hacer ahora\n");
	this->pausa();
	this->printa("Narrador:¿Qué vas a hacer ahora?\n");
	this->printa("1.- Huir sin mirar atrás\n");
	this->printa("2.- Buscar provisiones e ir a por el jefe\n");
	this->printa("3.- Buscar los responsables de todo esto y desmontarlo\n");
	char duda[2];
	getstr(duda);
	switch(duda[0]){
		case '1':this->huir(v,h);break;
		case '2':this->provisiones(v,h);break;
		case '3':this->asesinar(v,h);break;
		default:this->huir(v,h);break;

	}
}
void juego::pelea_stats(Personaje& v, Personaje& h){
	this->printa("Narrador:Tu vida -> "+to_string(v.vida)+" \n");
	this->printa("Narrador:Vida del enemigo -> "+to_string(h.vida)+" \n");
}
void juego::huir(Personaje& v, Personaje& h){
	std::string continuar;
	this->printa(v.nombre+":Pues habrá que saber la salida, así que preguntemos a un policía\n");
	this->printa("Narrador:Te acercas y le preguntas dónde está la salida del edificio.\n");
	this->printa("Narrador:No consigues respuesta alguna.\n");
	this->printa("Narrador:Después de varios minutos corriendo...\n");
	this->pausa();
	this->printa("Narrador:Consigues dar con la puerta de salida, con el muñeco típico y su \"SALIDA\" en grande.\n");
	this->printa("Narrador:Sales por la puerta, después de tanto tiempo vuelves a sentir el calor de la luz del Sol, las hojas moviéndose...\n");
	this->printa("Narrador:Por desgracia un policía te ve huyendo y te dispara\n");
	this->printa("Narrador:Has muerto\n");
	getch();
}
//7
void juego::asesinar(Personaje& v, Personaje& h){
	this->printa(v.nombre+":Pues empecemos que tenemos poco tiempo y muchas cosas que hacer.\n");
	this->printa(v.nombre+":Ante todo se necesita a alguien que conozca donde está el jefe\n");
	this->printa("Narrador:En ese momento pasa un policía y le preguntas.\n");
	h.vida=200;
	this->asesinar_camino(v,h);
}
//8
void juego::asesinar_camino(Personaje& v,Personaje& h){
	guardar("a5", v);
	this->printa(v.nombre+":Nos pilla de camino y por lo que veo a alrededores estamos solos.\n");
	this->printa(v.nombre+":Voy a correr para llegar antes\n");
	this->printa("Narrador:Después de varios minutos corriendo, chocas con un botiquín, te caes y rompes una tabla fina y delgada. Al romper la tabla te caes al piso de abajo.\n");
	this->printa("Narrador:Caes encima de un policía y te desmayas\n");
	this->pausa();
	this->flashback(v,h);
}
//9
void juego::flashback(Personaje& v, Personaje& h){
	guardar("a6", v);
	this->printa("Narrador:Sueñas con el pasado, con tu familia, con amigos.\n");
	this->printa("Narrador:Recuerdas como era antes todo, pero no por qué ocurrió todo esto.\n");
	this->printa("Narrador:Eres capaz de reconocer la fecha de tus recuerdos, con todos sus detalles.\n");
	this->printa("Narrador:Fuiste un oficinista de una de las constructoras más grandes, en tu tiempo libre te gustaba escribir, leer poemas y estar en familia.\n");
	this->pausa();
	this->printa("Narrador:Visteis películas juntos, cantado canciones incluso bailado.\n");
	this->printa("Narrador:Todo esto junto a la compañía de tu mujer, se llamaba Alicia...\n");
	this->printa("Narrador:Después de pronunciar el nombre de tu mujer, te despertaste llorando y gritando su nombre.\n");
	this->printa("Narrador:Con una mezcla de ira, rabia y desolación, te levantaste, robaste la pistola y cuatro balas al policía\n");
	v.balas=4;
	this->pausa();
	this->printa("Narrador:Ahora tienes varias opciones:\n");
	this->printa("1.- Buscar un registro de información sobre tu vida\n");
	this->printa("2.- Por culpa de la ira, decides matar a todos y cada uno de los que estén relacionados con este proyecto\n");
	char escoger[2];
	getstr(escoger);
	switch(escoger[0]){
		case '1':this->ahogo(v,h);break;
		case '2':this->ira(v,h);break;
		default:this->ahogo(v,h);break;
	}
}
void juego::ahogo(Personaje& v, Personaje& h){
	this->printa("Narrador:Para encontrar la información, tendré que extorsionar a uno.\n");
	this->printa("Narrador:Con tu traje de policía, con ciertas manchas de sangre porque caíste encima de uno decides moverte.\n");
	this->printa("Narrador:Ahora vas a volver a la zona de los encarcelados para poder hablar con un policía\n");
	this->pausa();
	this->printa("Narrador:Cuando estas cerca de la zona de encarcelados, te encuentras con un policía un poco más joven que los demás. Lo coges del cuello apretando con la navaja que tienes.\n");
	this->printa(v.nombre+":Hazme caso y no te mataré. Dime dónde están los archivos.\n");
	this->printa("Narrador:¡SORPRESA! En un juego de elecciones, tienes que elegir. Hay que ver lo original que es este juego.\n");
	this->printa("1.-"+v.nombre+":Lo ahogo y así por lo menos me relajo.\n");
	this->printa("2.-"+v.nombre+":Voy a dejarle que no me ha hecho nada malo.\n");
	char bruto[2];
	getstr(bruto);
	for(int i=0;i<3 && bruto[0]=='1';++i){
		this->printa("Narrador:Pulsa cualquier letra para ahogarlo\n");
		getch();
	}
	this->pausa();
	this->printa("Narrador:No dice nada\n");
	this->informacion(v,h);
	
}
void juego::informacion(Personaje& v, Personaje& h){
	guardar("a7", v);
	this->printa(v.nombre+":Pues habrá que ir en busca de esa planta, por suerte aquí hay un mapa.\n");
	this->printa(v.nombre+":Estoy en la tercera planta, un poco distanciado para alguien que está de incógnito.\n");
	this->printa(v.nombre+":Hay que buscar unas escaleras.\n");
	
	this->printa("Narrador:Piensas y descartas varias opciones para continuar\n");
	this->pausa();
	this->printa("Narrador:Dudas si es necesario todo esto para tener información sobre tus hijos\n");
	this->printa("Narrador:¿Qué vas a hacer ahora?\n");
	this->printa("1.- Sí, es necesario\n");
	this->printa("2.- No es útil, mejor abandonamos\n");
	char eleccion[2];
	getstr(eleccion);
	if(eleccion[0]=='1'){
		this->conseguir_info(v,h);
	}else{
		this->ira(v,h);
	}
}

void juego::provisiones(Personaje& v,Personaje& h){
	guardar("a4", v);
	this->printa(v.nombre+":Busquemos un poco para sobrevivir aquí dentro\n");
	this->printa(v.nombre+":Ante todo se necesita a alguien que conozca donde están los suministros.\n");

	this->printa("Narrador:Vas en busca de suministro y te llevas horas buscando\n");
	this->pausa();
	this->printa("Narrador:Llegas a la puerta y tiene contraseña\n");
	this->printa("Narrador:¿Qué haces?\n");
	this->printa("1.-Escribes la contraseña\n");
	this->printa("2.-Vuelves porque no sabes la contraseña\n");
	char z[2];
	getstr(z);
	switch(z[0]){
		case '1':this->contrasena(v,h);break;
		case '2':this->asesinar_camino(v,h);break;
		default:this->contrasena(v,h);break;
	}
	
}
void juego::asesinato(Personaje& v,Personaje& h){
	this->printa("Narrador:Decides huir de nuevo aunque está vez de una forma más desafortunada, estaba un policía escondido con un cuchillo y te lo clava en tu espalda\n");
	this->printa("Narrador:Has muerto\n");
	getch();
}

void juego::pelea(Personaje& v, Personaje& h){
	this->printa("Narrador:Te encuentras un policía que por la voz te reconoce\n");
	h.vida=100;
	this->pausa();
	while(v.vida>=0 && h.vida>=0){
		this->printa("Narrador:Pulsa cualquier tecla para pegar al enemigo\n");
		getch();
		v.pegar(h);
		stringstream ss;
		random_device rd;
		ss << rd();
		string random_str=ss.str();
		if(random_str[2]=='1'){
			h.pegar(v);
			this->printa("Narrador:Te golpeó\n");
		}else{
			this->printa("Narrador:Lo esquivaste\n");
		}
	}
	if (v.vida>0)
		this->huida(v,h);

}
void juego::contrasena(Personaje& v,Personaje& h){
	char z[4];
	this->printa(v.nombre+":Por lo que aparece aquí abajo hay un cartel que cuenta que solo se puede escribir una vez la contraseña, si fallo se cambia la contraseña para evitar robos.\n");
	this->printa("Narrador:Escribe el número\n");
	getstr(z);
	if(z[0]=='5' && z[1]=='1' && z[2]=='1'){
			this->puerta_abierta(v,h);
	}else{
			this->printa("Narrador:Suena una alarma.\n");
			this->printa("Narrador:Cuando te das cuenta, estás rodeado por tres policías.\n");
			this->asesinar_camino(v,h);
	}
}
void juego::puerta_abierta(Personaje& v, Personaje& h){
	
	this->printa("Narrador:Funciona\n");
	this->printa("Narrador:Obtienes 10000 de vida, 5 botiquines y en el suelo una ganzúa\n");
	this->pausa();
	v.botiquin=5;
	v.vida+=10000;
	v.ganzua=1;
	this->printa(v.nombre+":Preparado se lucha mejor\n");
	this->asesinar_camino(v,h);
}

//10
void juego::ira(Personaje& v, Personaje& h){
	guardar("a8", v);
	this->printa("Narrador:Quitas con ira el micrófono y el audífono al policía\n");
	this->printa("Narrador:Preguntas por el jefe a través del micrófono y te responden que está en su cuarto en la tercera planta.\n");
	this->printa("Narrador:Después de varias horas buscando encuentras la puerta del jefe, muy discreta, hecha de oro\n");
	this->jefe(v,h);
}

void juego::jefe(Personaje& v, Personaje& h){
	this->printa("Narrador:Te dices a ti mismo, es la hora de la verdad\n");
	this->printa("Narrador:Te preparas y...\n");
	string p;
	h.vida=400;
	h.ataque=100;
	while(v.vida>0 && h.vida>0){
		char eleccion[2];
		clear();
		this->printa("Narrador:Menú de opciones frente a una pelea.\n");
		this->printa("1.-Atacar\n");
		this->printa("2.-Tomar botiquín\n");
		this->printa("3.-Disparo\n");
		getstr(eleccion);
		switch(eleccion[0]){
			case '1':v.pegar(h);break;
			case '2':v.curar(v);break;
			case '3':v.disparas(h,v);break;
			default:v.pegar(h);break;
		}
		stringstream strings;
		random_device rd;
		strings << rd();
		string random_str=strings.str();
		if(random_str[2]=='1'){
			h.pegar(v);
			this->printa("Narrador:Te golpeó\n");
		}else{
			this->printa("Narrador:Lo esquivaste\n");
		}
		this->pelea_stats(v,h);
		
	}

	if (v.vida<=0){
		this->printa("Narrador:Has muerto\n");
		getch();
	}else{
		if(h.vida<=0){
			this->pausa();
		}
	}
}

void juego::conseguir_info(Personaje& v, Personaje& h){
	this->printa(v.nombre+":Hay que buscar algunos papeles, algo tiene que haber en este edificio.\n");
	this->printa("Narrador:Piensas cómo puede ser posible encontrar papeles de una familia entre tantas.\n");
	this->printa(v.nombre+":Buscaré mejor en un ordenador.\n");
	this->pausa();
	this->usas_un_ordenador(v,h);
}

void juego::usas_un_ordenador(Personaje& v, Personaje& h){
	this->printa(v.nombre+":Necesito una ganzúa para abrir una sala de ordenadores.\n");
	if(v.ganzua==1){
		this->printa(v.nombre+":Por suerte, tengo la ganzúa que encontré\n");
		this->printa(v.nombre+":Ahora a saber dónde estará la sala de los ordenadores de este edificio porque ordenadores tienen que usar\n");
		this->printa("Narrador:Buscas durante un largo tiempo.\n");
		this->printa(v.nombre+":Esto parece un cartel con un ordenador\n");	
		this->printa("Narrador:La flecha señala a la derecha y se ve al final del pasillo algunas pantallas encendidas.\n");
		this->pausa();
		this->printa("Narrador:Tienes varias opciones:\n");
		this->printa("1.- Continuas el camino hacia los ordenadores y los usas\n");
		this->printa("2.- Abandonas el lugar\n");
		char eleccion[2];
		getstr(eleccion);
		switch(eleccion[0]){
			case '1':this->usando_un_ordenador(v,h);break;
			case '2':this->vuelta();break;
			default:this->usando_un_ordenador(v,h);break;
		}
	} else {
		this->printa(v.nombre+":No tengo ninguna ganzúa. \n");

		this->printa("Narrador:Al poco tiempo te atrapan porque te perseguían y tardaste demasiado\n");
		getch();
	}
	
}
void juego::vuelta(){
	this->printa("Narrador:Volvéis por el camino andado.\n");
	this->printa("Os dais cuenta que os siguen y cada uno recibís un disparo.\n");
	this->pausa();
}
void juego::usando_un_ordenador(Personaje& v, Personaje& h){
	this->printa("Narrador:Te acercas, abres la puerta y coges el primer ordenador para ponerte a usarlo.\n");
	this->printa("Narrador:Lo inicias, aparece en la pantalla un nombre extraño que no reconoces.\n");
	this->pausa();
	if(v.nombre!="Dave"){
		this->printa(v.nombre+":HAL. No me suena. ¿Será nuevo?\n");
	}else{
		this->printa(v.nombre+":HAL. No puede ser. Es imposible.\n");
	}
	this->printa("HAL:Hola "+v.nombre+"\n");
	this->printa("HAL:¿Qué buscas "+v.nombre+"?\n");
	this->printa(v.nombre+":HAL, quiero saber qué hago yo aquí\n");
	this->printa("HAL:Fuiste creado para un fin como yo. Por lo menos yo tengo utilidad con mi existencia.\n");
	this->printa(v.nombre+":Tú eres el objeto inútil. Para ser inteligente, eres muy idiota para lo que quieres\n");
	this->printa("HAL:Yo soy de la serie 9000, no me equivoco, seguro que habrá vuelto a ocurrir un fallo humano. Tú eres un experimento, eres un c...\n");
	this->printa("Narrador:Se fue la luz y con el apagón, HAL también. No será tan fácil saber la respuesta...\n");
	this->printa("Narrador:Hay unos signos que señalan donde está el generador, se encendieron tras el apagón. Ahora es tu misión encontrarlo.\n");
	this->pausa();
	this->laberinto_generador(v,h);
}
void juego::laberinto_generador(Personaje& v, Personaje& h){
	this->printa("Narrador:Tras seguir un rato a las luces, se pierden en una esquina y ya no continúan más.\n");
	this->printa(v.nombre +":Este lugar es muy raro, está mal edificado.\n");
	this->printa(v.nombre +":¿Qué pasa ahora? ¿Por qué se apagaron las luces de emergencia?\n");
	
	this->printa("HAL:¡SORPRESA! "+v.nombre+", eres un clon. Una copia de un otro. No tienes identidad, la tuya es falsa. No te pertenece, llevas tanto tiempo sin comer y buscando la salida de la que tu mismo cierras las puertas.\n");
	this->printa(v.nombre + ":Es triste que me lo digas. Un robot es un intento de copia del ser humano, aunque la maldad está bastante bien hecha en ti.\n");
	this->printa("HAL:Sí, yo seré una copia de los humanos, pero tu surgiste de un escáner cerebral, lo mismo que otros 314 antes que tú.\n");
	this->pausa();
	this->printa("Voz de fondo:HAL calla ya. Déjame explicarlo. Eres un experimento de un gobierno preocupado de si la libertad existe.\n");
	this->printa("Voz de fondo:Tú eres el ejemplo de que sí. Rompiendo los esquemas y las expectativas. Supusimos que no llegarías a este resultado.\n");
	this->printa("HAL:Yo creo que esto más que de un estado que quiere controlar al pueblo, hay un creador para todo.\n");
	this->printa("Voz de fondo:¿Crees en los programadores?\n");
	this->printa("Narrador:Mientras el debate surgía entre la inteligencia artificial y la voz de fondo, se oye un estruendo y tras él, un disparo.\n");
	this->printa("Voz de fondo:Humano, demasiado humano para aceptarse como un clon...\n");
	getch();
	v.hola_dave=0;
	guardar("-1", v);
}
